修改ECI Pod的镜像并保持IP不变

对于部署在虚拟节点上的Pod应用,在应用迭代过程中,因为解决bug或者增加功能特性而制作新的镜像后,您可能需要修改镜像,同时为了不影响业务,需要保持Pod的IP不变。本文介绍如何通过kubectl命令修改Pod的容器镜像,并保持Pod的IP不变。

前提条件

已准备好要更新的镜像,且已将镜像上传到镜像仓库中。

操作步骤

下文以部署Nginx的Pod为例,介绍如何通过kubectl命令,将容器镜像从nginx:1.7.9修改为nginx:1.9.6,并保持Pod的IP不变。

说明

体验以下示例请确保集群所属VPC已创建公网NAT网关并配置SNAT,以便可以拉取公网镜像。

  1. 创建一个ECI Pod。

    kubectl create -f nginx.yaml

    nginx.yaml的内容示例如下,使用的容器镜像为nginx:1.7.9

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: default
      alibabacloud.com/eci: "true" 
    spec:
      containers:
      - image: nginx:1.7.9
        imagePullPolicy: Always
        name: nginx
  2. 查询Pod信息。

    1. 查询Pod的IP。

      kubectl get pod/nginx -n default -o wide

      返回示例如下,可以看到Pod的IP为172.16.22.193。

      NAME    READY   STATUS    RESTARTS   AGE    IP              NODE                           NOMINATED NODE   READINESS GATES
      nginx   1/1     Running   0          5m5s   172.16.22.193   virtual-kubelet-cn-beijing-e   <none>           <none>
    2. 查询Pod的镜像tag。

      kubectl get pod/nginx -n default -o=custom-columns='IMAGE:spec.containers[*].image'

      返回示例如下,可以查看Pod的容器镜像为nginx:1.7.9

      IMAGE
      nginx:1.7.9
  3. 选择以下一种方式修改镜像。

    • kubectl patch

      执行kubectl命令直接修改容器镜像tag。

      kubectl patch pod nginx -p '{"spec":{"containers":[{"name": "nginx","image": "nginx:1.9.6"}]}}'
    • kubectl edit

      执行kubectl edit命令编辑Pod,直接修改容器镜像tag。

      kubectl edit pod/nginx -o yaml 
    • kubectl apply

      打开Pod对应的nginx.yaml配置文件,修改容器镜像tag,然后执行kubectl apply命令重新部署Pod。

      kubectl apply -f nginx.yaml 
  4. 查看修改后的Pod信息。

    1. 查询Pod的IP。

      kubectl get pod/nginx -n default -o wide

      返回示例如下,可以看到Pod的IP与修改前一致,为172.16.22.193。

      NAME    READY   STATUS    RESTARTS   AGE   IP              NODE                           NOMINATED NODE   READINESS GATES
      nginx   1/1     Running   1          19m   172.16.22.193   virtual-kubelet-cn-beijing-e   <none>           <none>
    2. 查询Pod的镜像tag。

      kubectl get pod/nginx -n default -o=custom-columns='IMAGE:spec.containers[*].image'

      返回示例如下,可以查看Pod的容器镜像已经修改为nginx:1.9.6

      IMAGE
      nginx:1.9.6